package oo

import "fmt"
//方法接收者也是值拷贝，根据类型不同做不同拷贝


//• 类型 T 方法集包含全部 receiver T 方法。
//• 类型 *T 方法集包含全部 receiver T + *T 方法。
//• 如类型 S 包含匿名字段 T，则 S 和 *S 方法集包含 T 方法。
//• 如类型 S 包含匿名字段 *T，则 S 和 *S 方法集包含 T + *T 方法。
//• 不管嵌入 T 或 *T，*S 方法集总是包含 T + *T 方法。

type Test struct {
	name   string
	closed bool
}

func (t *Test) Close() {
	t.closed = true
	fmt.Println(t.name, " closed")
}

func (t Test) Close2() {
	//t不是指针，在执行时候会拷贝，就以指针方式调用
	fmt.Printf("%p\n",&t)
	t.closed = true
	fmt.Println(t.name, " closed")
}

type TestNew struct {
	time int
	* Test
}


func run1() {
	t := Test{name: "mke", closed: false}
	var t2 = t
	//t2拷贝了一份，执行时候已不是原来的结构体了
	t2.Close()

	fmt.Println(t.name, "->", t.closed)
}
func run2() {
	t := Test{name: "mke", closed: false}
	//t不是指针在执行时候会自动取地址,拷贝地址给方法做接收者
	t.Close()
	fmt.Println(t.name, "->", t.closed)
}

func run3() {
	t := &Test{name: "mke", closed: false}
	fmt.Printf("%p\n",t)
	//t不是值，会拷贝*t给方法做接收者
	t.Close2()
	fmt.Println(t.name, "->", t.closed)
}

func RunRecevier() {
	//run1()
	//run2()
	run3()

}
